﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.Utils.Menu;
using AppForm_Managers.Object_Entities;
using System.Data.Entity;

namespace AppForm_Managers.Views
{
    public partial class Location_Districts : Form
    {
        public Location_Districts()
        {
            InitializeComponent();
        }

        private void Location_Districts_Load(object sender, EventArgs e)
        {
            NotiLable.Visible = false;
            NotiLable.Text = "";
            ErrorProvider.Dispose();

            DropProvinces_DataLoad();
            GridControlDistricts_DataLoad();

            Controls_Reset();
        }

        private void GridControlDistricts_DataLoad()
        {
            using (ManagerEmployeesEntities db = new ManagerEmployeesEntities())
            {
                GridControlDistricts.DataSource = db.View_Districts.ToList();
            }
        }

        private void DropProvinces_DataLoad()
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<Province> list = new List<Province>();

                Province pv = new Province()
                {
                    ProvID = 0,
                    NameOfProvince = "Lựa Chọn",
                    StatusOfProvince = false
                };
                list.Add(pv);
                list.AddRange(db.Provinces.ToList());

                DropProvinces.DataSource = list;

                DropProvinces.DisplayMember = "NameOfProvince";
                DropProvinces.ValueMember = "ProvID";

                DropProvinces.SelectedIndex = 0;
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại sau", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void Controls_Reset()
        {
            AddButton.Enabled = true;
            UpdateButton.Enabled = false;
            DeleteButton.Enabled = false;

            DropProvinces.SelectedIndex = 0;
            DistrictsText.Text = "";
            CheckStatus.Checked = false;
        }

        private void ViewDistricts_Click(object sender, EventArgs e)
        {
            NotiLable.Visible = false;
            NotiLable.Text = "";
            ErrorProvider.Dispose();

            List<int> listSelected = ViewDistricts.GetSelectedRows().ToList<int>();
            int index = -1;
            foreach (var item in listSelected)
            {
                if (item > -1)
                {
                    index = item;
                    break;
                }
            }
            if (index > -1)
            {
                UpdateButton.Enabled = true;
                DeleteButton.Enabled = true;
                AddButton.Enabled = false;

                DistrictsText.Text = ViewDistricts.GetRowCellValue(index, "NameOfDist").ToString();
                CheckStatus.Checked = bool.Parse(ViewDistricts.GetRowCellValue(index, "StatusDist").ToString());
                DropProvinces.SelectedValue = Int32.Parse(ViewDistricts.GetRowCellValue(index, "ProvID").ToString());
            }
        }


        private void AddButton_Click(object sender, EventArgs e)
        {
            NotiLable.Visible = false;
            NotiLable.Text = "";
            ErrorProvider.Dispose();

            if (DropProvinces.SelectedIndex == 0)
            {
                ErrorProvider.SetError(DropProvinces, "Bạn chưa chọn tỉnh thành");
                DropProvinces.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            if (DistrictsText.Text.Trim().Length == 0)
            {
                ErrorProvider.SetError(DistrictsText, "Tên tỉnh, thành không được để trống");
                DistrictsText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            int id = Int32.Parse(DropProvinces.SelectedValue.ToString());
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                Province prov = db.Provinces.Single(p => p.ProvID == id);
                foreach (var item in prov.Districts)
                {
                    if (item.NameOfDist.ToLower().Equals(DistrictsText.Text.Trim().ToLower()))
                    {
                        NotiLable.Text = "Quận, huyện đã tồn tại.";
                        NotiLable.Visible = true;
                        NotiLable.ForeColor = Color.OrangeRed;
                        DistrictsText.Focus();
                        ErrorProvider.SetError(DistrictsText, "Quận huyện đã tồn tại, hãy thử lại");
                        return;
                    }
                }

                District dis = new District()
                {
                    ProvID = Int32.Parse(DropProvinces.SelectedValue.ToString()),
                    NameOfDist = DistrictsText.Text.Trim(),
                    StatusDist = CheckStatus.Checked
                };

                db.Districts.Add(dis);
                int re = db.SaveChanges();

                if (re == 1)
                {
                    NotiLable.Text = "Thêm mới quận, huyện thành công.";
                    NotiLable.Visible = true;
                    NotiLable.ForeColor = Color.Teal;
                    ErrorProvider.Dispose();
                    GridControlDistricts_DataLoad();

                    Controls_Reset();
                }
                else
                {
                    NotiLable.Text = "Hệ thống đang bận, hãy thử lại";
                    NotiLable.Visible = true;
                    NotiLable.ForeColor = Color.OrangeRed;
                    ErrorProvider.Dispose();
                }
            }
            catch (Exception)
            {
                NotiLable.Text = "Hệ thống đang bận, hãy thử lại";
                NotiLable.Visible = true;
                NotiLable.ForeColor = Color.OrangeRed;
                ErrorProvider.Dispose();
            }
        }

        private void UpdateButton_Click(object sender, EventArgs e)
        {
            NotiLable.Visible = false;
            NotiLable.Text = "";
            ErrorProvider.Dispose();

            if (DropProvinces.SelectedIndex == 0)
            {
                ErrorProvider.SetError(DropProvinces, "Bạn chưa chọn tỉnh thành");
                DropProvinces.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            if (DistrictsText.Text.Trim().Length == 0)
            {
                ErrorProvider.SetError(DistrictsText, "Tên tỉnh, thành không được để trống");
                DistrictsText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();


            List<int> listSelected = ViewDistricts.GetSelectedRows().ToList<int>();
            int index = -1;
            foreach (var item in listSelected)
            {
                if (item > -1)
                {
                    index = item;
                    break;
                }
            }
            int distID = Int32.Parse(ViewDistricts.GetRowCellValue(index, "DistID").ToString());
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            int provinceId = Int32.Parse(DropProvinces.SelectedValue.ToString());
            try
            {
                Province prov = db.Provinces.Single(p => p.ProvID == provinceId);
                foreach (var item in prov.Districts)
                {
                    if (item.NameOfDist.ToLower().Equals(DistrictsText.Text.Trim().ToLower()) && distID != item.DistID)
                    {
                        NotiLable.Text = "Trong tỉnh đã có huyện này.";
                        NotiLable.Visible = true;
                        NotiLable.ForeColor = Color.OrangeRed;
                        DistrictsText.Focus();
                        ErrorProvider.SetError(DistrictsText, "Quận huyện đã tồn tại, hãy thử lại");
                        return;
                    }
                }
                District dist = db.Districts.Single(d => d.DistID == distID);
                dist.ProvID = Int32.Parse(DropProvinces.SelectedValue.ToString());
                dist.NameOfDist = DistrictsText.Text;
                dist.StatusDist = CheckStatus.Checked;

                if (MessageBox.Show("Bạn có muốn thay đổi thông tin?", "Cập nhật", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    db.SaveChanges();

                    NotiLable.Text = "Cập nhật thông tin quận, huyện thành công.";
                    NotiLable.Visible = true;
                    NotiLable.ForeColor = Color.Teal;
                    ErrorProvider.Dispose();
                    GridControlDistricts_DataLoad();

                    Controls_Reset();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void DeleteButton_Click(object sender, EventArgs e)
        {
            try
            {
                NotiLable.Visible = false;
                NotiLable.Text = "";
                ErrorProvider.Dispose();

                List<int> listSelected = ViewDistricts.GetSelectedRows().ToList<int>();
                int index = -1;
                foreach (var item in listSelected)
                {
                    if (item > -1)
                    {
                        index = item;
                        break;
                    }
                }

                int distID = Int32.Parse(ViewDistricts.GetRowCellValue(index, "DistID").ToString());
                ManagerEmployeesEntities db = new ManagerEmployeesEntities();
                District dist = db.Districts.Single(d => d.DistID == distID);
                List<Commune> commList = dist.Communes.ToList<Commune>();
                foreach (Commune item in commList)
                {
                    db.Communes.Remove(item);
                }
                db.Districts.Remove(dist);


                if (MessageBox.Show(String.Format("Bạn có muốn xóa quận, huyện '{0}'?", dist.NameOfDist), "Xóa quận huyện", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    db.SaveChanges();

                    NotiLable.Text = "Xóa thành công.";
                    NotiLable.Visible = true;
                    NotiLable.ForeColor = Color.Teal;
                    ErrorProvider.Dispose();

                    GridControlDistricts_DataLoad();
                    Controls_Reset();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại sau", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                ErrorProvider.Dispose();
                GridControlDistricts_DataLoad();

                Controls_Reset();
            }
        }

        private void CancelsButton_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có muốn hủy bỏ thao tác và làm mới?", "Hủy bỏ thao tác và làm mới", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                Controls_Reset();
                NotiLable.Visible = false;
                NotiLable.Text = "";
                ErrorProvider.Dispose();
                DropProvinces_DataLoad();
                GridControlDistricts_DataLoad();
            }
        }
    }
}
